package com.frejoys.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.frejoys.common.dto.admin.StoreIdAndOrderDto;
import com.frejoys.common.dto.admin.StoreIdAndPageDto;
import com.frejoys.common.dto.common.IdDto;
import com.frejoys.common.dto.common.OrderSnDto;
import com.frejoys.common.dto.order.*;
import com.frejoys.common.vo.admin.OrderListVo;
import com.frejoys.common.vo.app.StoreIdAndOrderSnVo;
import com.frejoys.common.vo.order.*;
import com.frejoys.common.vo.pay.OrderSnWxJsPayVo;
import com.frejoys.common.vo.store.ScanOrderInfoVo;
import com.frejoys.dao.entity.Order;
import com.frejoys.dao.entity.StoreActivityQueue;

import java.math.BigDecimal;
import java.util.List;

public interface OrderService extends IService<Order> {

    default Order getOnly(QueryWrapper<Order> wrapper) {
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    }

    default Order getOnly(LambdaQueryWrapper<Order> wrapper) {
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    }

    // 更新订单支付状态
    boolean refundUpOrderPayStatus(Integer id, Integer newPayStatus, Integer oldPayStatus, Integer verify, Integer isScore);

    // 更新订单核销状态
    boolean upVerifyStatus(Integer id, Integer newVerifyStatus, Integer oldVerifyStatus, Integer payStatus, Integer isScore);

    // 退款回调更新订单支付状态
    boolean refundCallbackOrderPayStatus(Long orderSn, Integer oldPayStatus, Integer newPayStatus);

    // 更新订单支付状态
    boolean taskUpOrderPayStatus(List<Long> orderSn, Integer oldPayStatus, Integer newPayStatus, Integer verify);

    // 微信订单下单
    OrderSnWxJsPayVo wxOrderConfirm(Long userId, OrderPlaceDto dto);

    // 微信订单直接下单
    OrderSnWxJsPayVo wxPayOrderConfirm(Long userId, PayMoneyDto dto);

    // 支付宝订单下单
    String aliOrderH5(Long userId, OrderPlaceDto dto);

    // 支付宝订单直接下单
    String aliOrderPayH5(Long userId, PayMoneyDto dto);

    // 生成订单相关信息 - 实物订单
    Order createOrderInfo(Long userId, Integer payType, OrderPlaceDto dto);

    // 生成订单相关信息 - 虚拟订单
    Order createOrderInfo(Long userId, Integer payType, PayMoneyDto dto);

    // 还原订单库存信息
    boolean resetOrderRepCountPo(Long orderSn);

    // 申请订单退款
    boolean orderRefund(Long userId, Integer id);

    // 订单转积分
    boolean orderScore(Long userId, Integer id);

    // 订单核销
    boolean orderVerify(Long storeUserId, Integer id, Long orderSn);

    // 处理订单支付完成异步通知
    boolean notifyDisposeOrder(Long orderSn, Integer verify);

    // 定时获取未支付，失效订单
    List<Order> getNoPayTimeoutOrder(Integer page, Integer size);

    // 定时获取已支付，核销中订单
    List<Order> getVerifyInProgressOrder(Integer page, Integer size);

    // 定时任务获取订单信息
    List<Order> getListTaskByOrderSn(List<String> orderSn);

    // 任务更新订单状态
    boolean upOrderStatus(List<Long> orderSn, Integer status);

    // 订单验证是否支付
    void checkOrder(Order order);

    // 获取商家订单信息，userId为商家
    ScanOrderInfoVo getStoreOrderInfoByOrderSn(Long orderSn, Long storeUserId);

    // 根据订单编号活动店铺id和价格
    Order getStoreIdPriceByOrderSn(Long orderSn);

    /**
     * 商家端分页查询订单数据
     */
//    List<StoreOrderPageVo> pageOrder(OrderStorePageDto dto, Long userId);

    /**
     * 商家端查询订单详情
     */
//    StoreOrderInfoVo getInfoByStore(IdDto idDto);

    /**
     * 用户查询订单数据
     */
    List<UserOrderPageVo> pageOrderList(OrderUserPageDto dto, Long userId);

    /**
     * 用户查询订单详情
     */
    UserOrderInfoVo getInfoByUser(IdDto idDto);

    //根据订单号查询是否支付
    StoreIdAndOrderSnVo getPayStatus(OrderSnDto dto);

    //管理员查询订单列表
    IPage<OrderListVo> orderListInfo(StoreIdAndOrderDto dto);

    //商家查看订单列表
    OrderAndGoodsListVo storeOrderListInfo(OrderListDto dto,Long userId);

    //商家查看订单详情
    StoreOrderVo getStoreByOrder(IdDto dto);

    //根据订单id查询下单用户id
    Long userIdByOrderId(Integer id);

    //更新任务状态
    boolean updateOrderStatus(Long orderSn, Long userId, Integer verifyStatus,Integer isScoreStatus);

}
